from rest_framework import serializers

from booktest.models import BookInfo


class HeroInfoSerializer(serializers.Serializer):
    """英雄序列化类"""
    GENDER_CHOICES = (
        (0, '男'),
        (1, '女')
    )
    id = serializers.IntegerField(label='英雄id',read_only=True)
    hname = serializers.CharField(label='名称')
    hgender = serializers.ChoiceField(choices=GENDER_CHOICES,default=0,label='性别')
    hcomment = serializers.CharField(label='备注')

    # 1.将关联对象序列化为关联对象的主键
    # hbook = serializers.PrimaryKeyRelatedField(label='图书',read_only=True)

    # 2.使用指定的序列化器将关联对象进行序列化
    # hbook = BookInfoSerializer(label='图书')

    # 3.将关联对象序列化为关联对象模型类__str__方法的返回值
    # hbook = serializers.StringRelatedField(label='图书')

def about_django(value):
    if 'django' not in value.lower():
        raise serializers.ValidationError('图书不是关于django的')
    return value

class BookInfoSerializer(serializers.Serializer):
    """图书序列化器类"""
    id = serializers.IntegerField(label='图书的id',read_only=True)# read_only表明这个字段仅仅用在序列化时有
    # btitle = serializers.CharField(label='标题',validators=[about_django])
    btitle = serializers.CharField(label='标题')
    bpub_date = serializers.DateField(label='出版日期')
    bread = serializers.IntegerField(label='阅读量',required=False)# required表明反序列化的时候可以不传入
    bcomment = serializers.IntegerField(label='评论量',required=False)
    image = serializers.ImageField(label='封面图片',required=False,allow_null=True) # allow_null允许为空

    # 1.将关联对象序列化为关联对象的主键
    # heroinfo_set = serializers.PrimaryKeyRelatedField(label='英雄',read_only=True,many=True)

    # 2.使用指定的序列化器将关联对象进行序列化
    # heroinfo_set = HeroInfoSerializer(label='英雄',many=True)


    # 3.将关联对象序列化为关联对象模型类__str__方法的返回值
    # heroinfo_set = serializers.StringRelatedField(label='英雄',many=True)

    # 以下两种方式重点掌握
    # def validate_btitle(self,value):
    #     if 'django' not in value.lower():
    #         raise serializers.ValidationError('图书不是关于django2')
    #     return value
    # def validate(self, attrs):
    #     bread = attrs['bread']
    #     bcomment = attrs['bcomment']
    #     if bread < bcomment:
    #         raise serializers.ValidationError('图书的阅读量必须大于评论量')
    #     return attrs

    def create(self, validated_data):
        """
        validated_data:校验之后 的数据
        :param validated_data:
        :return:
        """
        book = BookInfo.objects.create(**validated_data)
        return book
    def update(self, instance, validated_data):
        """
        instance:创建序列化对象时传入的实例对象
        validated_data:字典，校验之后的数据
        :param instance:
        :param validated_data:
        :return:
        """
        # 获取btitile和bpub_date
        # 在后面设置默认值，比如我们只想更新一个字段的值，但是不想修改的值是不为空的，我们就可以在获取不到的时候将它原来的值进行传递
        btitle = validated_data.get('btitle',instance.btitle)
        bpub_date = validated_data.get('bpub_date',instance.bpub_date)

        instance.btitle = btitle
        instance.bpub_date = bpub_date
        instance.save()
        return instance